iT邦幫忙

2023 iThome 鐵人賽

DAY 23
0
自我挑戰組

ChatGPT應用指南---30天學習之旅系列 第 23

Day23 - 利用OpenAI API建立類似ChatGPT功能的程式(Part1)

  • 分享至 

  • xImage
  •  

今天要利用OpenAI API建立一個類似ChatGPT聊天功能的程式。使用的是Google Colab線上開發環境。

  1. 第一個步驟和上一篇一樣,先安裝OpenAI函式庫。
!pip install openai
import openai    # 設定金鑰
openai.api_key = "你的金鑰"
  1. 將取用API的部分,獨立去定義成一個函式。
def get_reply(messages):
    try:
        response = openai.ChatCompletion.create(
            model = "gpt-3.5-turbo",
            messages = messages
        )
        reply = response["choices"][0]["message"]["content"]
    except openai.OpenAIError as err:
        reply = f"發生 {err.error.type} 錯誤\n{err.error.message}"
    return reply
  1. 製作以文字型態對答的流程
msg = ""
while True:
    msg = input("你:")
    if msg == "結束": break        # 如果使用者輸入「結束」,程式就結束
    messages = [{"role":"user", "content":msg}]
    reply = get_reply(messages)    # 取得API回覆內容
    print(f"AI:{reply}")

執行結果:
https://ithelp.ithome.com.tw/upload/images/20231008/20162810q35tYNDFHn.png

  1. 紀錄對話過程。因為程式不會記錄對話內容,若繼續追問時,會發現對話沒有和前一段接續。不過一直紀錄之前的對話紀錄會導致token數越來越多,我們還是要考慮到成本,因此以下作法能在對話量超過限制時,將最舊的一筆對話刪除。
hist = []       # 過去的對話紀錄
backtrace = 2   # 記錄對話的組數

def chat(sys_msg, user_msg):
    while len(hist) >= 2 * backtrace: # 當有超過了記錄限制
        hist.pop(0)                   # 移除掉最舊的那筆紀錄
    hist.append({"role":"user", "content":user_msg})
    reply = get_reply(hist + [{"role":"system", "content":sys_msg}])
    while len(hist) >= 2 * backtrace: # 當有超過了記錄限制
        hist.pop(0)                   # 移除掉最舊的紀錄
    hist.append({"role":"assistant", "content":reply})
    return reply     # 回傳API回覆內容
  1. 也可以加入一行,讓使用者可以輸入SYSTEM系統訊息。
msg = ""
sys_msg = input("你希望AI扮演:")
while True:
    msg = input("你:")
    if msg == "結束": break
    reply = chat(sys_msg, msg)
    print(f"AI:{reply}")

執行結果:
https://ithelp.ithome.com.tw/upload/images/20231008/20162810Ekr2RT9s9O.png

今天先做到這邊,明天會使用gradio套件來將文字聊天模式轉換為一個簡單的網頁應用程式。


上一篇
Day22 - 使用Python串接OpenAI API
下一篇
Day24 - 使用gradio將文字聊天模式轉為網頁程式(Part2)
系列文
ChatGPT應用指南---30天學習之旅30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言